import javax.swing.*;
import javax.swing.text.AbstractDocument;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/*
Java为所有组件定义了超类，以方便统一管理；容器可以被当成特殊组件，放入另一个容器中；

窗口:在屏幕中划分一个小屏幕，显示可视组件

通常创建JFrame子类对象，实现个性化界面
 */

public class Project {
    public static void main(String[] args){
        JFrame fm = new JFrame("First JFrame");//创建一个名为"First JFrame"的窗口
        fm.pack();//紧凑显示，解决内部组件拖放后才能显示
        //fm.setSize(640,480);
        fm.setBounds(100,200,640,480);//指定边界，大小
        fm.setResizable(true);//设置可缩放
        //fm.getContentPane().setVisible(false);//隐藏JFrame的默认面板ContentPane.
        fm.getContentPane().setBackground(Color.pink);//
        fm.setBackground(Color.pink);//给JFrame设置背景颜色
        fm.setTitle("New Title");//设置新标题
        System.out.println("获取到界面标题："+fm.getTitle());//显示标题



        MyFrame myFrame1 = new MyFrame("My Frame1", 320,240,Color.yellow);
        myFrame1.setVisible(true);

        MyPanel myPanel = new MyPanel("b1", "b2", "label");
        myPanel.setVisible(true);
        fm.setContentPane(myPanel);

        MyScroll myScroll = new MyScroll();

        fm.setVisible(true);//显示窗口

    }
}

/*
按键事件
    食用方法:
    1.创建一个类，实现ActionListener接口的actionPerformed方法
    2.向监视器注册本对象目标信号，按键通过addActionListener()通知指定接收方本对象将发起的信号
    3.在actionPerformed方法实现信号响应
 */
class MyFrame extends JFrame implements ActionListener{
    JButton bt1;//信号触发者(发送端)
    JButton bt2;
    JLabel lb;
    Container container;
    public MyFrame(String Title,int wd, int hg, Color c){
        super();
        setSize(wd,hg);
        setTitle(Title);

        bt1 = new JButton("JButton1");
        bt2 = new JButton("JButton2");
        lb = new JLabel("Label", JLabel.CENTER);

        container = getContentPane();
        container.setLayout(new FlowLayout());
        container.add(bt1);
        container.add(bt2);
        container.setBackground(c);
        bt1.addActionListener(this);//信号接收者(接收端)---注册所需要的信号
        bt2.addActionListener(this);
        bt1.setMnemonic('W');//设置快捷键，通过ALT组合
        bt2.setMnemonic('S');

        lb.setSize(60,60);
        lb.setBackground(Color.blue);
        lb.setForeground(Color.black);
        container.add(lb);

    }

    @Override
    public void actionPerformed(ActionEvent e) {//信号处理(响应函数)
        if (e.getSource().equals(bt1)){
            System.out.println(bt1.getText());
            container.setBackground(Color.pink);
        }else if (e.getSource().equals(bt2)){
            System.out.println(bt2.getText());
            container.setBackground(Color.yellow);
        }else{
            System.out.println("other");
            container.setBackground(Color.black);
        }
    }
}

/*
Panel是一种通用容器
    放组件，绘画，可以放到其他容器
    JPanel的默认布局为FlowLayout。
    使用Add添加组件
 */
class MyPanel extends JPanel{
    JButton bt1,bt2;
    JLabel lab;
    MyPanel(String b1, String b2,String label){
        bt1 = new JButton(b1);
        bt2 = new JButton(b2);
        lab = new JLabel(label);

        add(bt1);
        add(bt2);
        add(lab);
    }
}

/*
滚动条
    特性：只能添加一个组件
食用方法
    1.创建一个容器面板
    2.在容器面板中放入所需组件
    3.创建一个滚动面板，将容器面板当成组件放入滚动面板中
    4.将滚动面板加入主面板中完成显示
 */

class MyScroll extends JFrame{
    JScrollPane jsp;
    JTextArea jsa;
    MyScroll(){
        jsa = new JTextArea(100,50);
        jsp = new JScrollPane(jsa);
        jsp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);//设置水平方向不允许滚动
        getContentPane().add(jsp);
        setTitle("Scroll");
        setSize(600,480);
        setVisible(true);
    }
}
